import ajax from './ajax'

import {
  Loading,
  Message,
  MessageBox
} from 'element-ui'

/**
 *
 * @param {Libs} axios 请求示例(为什么要传能? 估计跟 MessageBox 报错有关)
 * @param {String} url 请求地址
 * @param {Option} objConfig 配置项+数据
 *          objConfig = { data, method, loading, success, fail, update }
 * 返回 promis 对象
 */

const sendAjax = (axios, url, objConfig) => {
  // 加载loading
  let loadingInstance = null
  if (objConfig.loading) {
    loadingInstance = Loading.service({
      lock: true,
      text: '拼命加载中...',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    })
  }

  return axios[objConfig.method](url, objConfig.data || {})
    .then(res => {
      // 在这里做放回后的处理

      loadingInstance && loadingInstance.close()
      let jsonData
      try {
        jsonData = res && res.data ? JSON.parse(res.data) : {} // 为什么要这一步??
      } catch (e) {
        Message({
          center: true,
          message: '返回结果非JSON数据'
        })
        jsonData = res
      }
      if (objConfig.method === 'put' || objConfig.update) {
        Message({
          center: true,
          type: 'success',
          message: '保存成功'
        })
      }
      objConfig.success && objConfig.success(jsonData)
      return jsonData
    })
    .catch(error => {
      loadingInstance && loadingInstance.close()
      Message({
        center: true,
        message: '网络似乎有点忙，稍后在试'
      })
      objConfig.fail && objConfig.fail(error)
      return error
    })
}

const fetch = (url, objc) => {
  // 默认请求
  if (!objc.method) {
    objc.method = 'get'
  }

  // 发起请求
  if (objc.update) {
    return MessageBox.confirm('确定要修改数据么？', '修改提示', {
      type: 'warning'
    })
      .then(() => sendAjax(ajax, url, objc))
      .catch(() => console.log('取消修改'))
  }

  if (objc.method === 'delete') {
    return MessageBox.confirm('确定要删除数据么？', '删除提示', {
      type: 'warning'
    })
      .then(() => sendAjax(ajax, url, objc))
      .catch(() => console.log('取消删除'))
  } else {
    return sendAjax(ajax, url, objc)
  }
}

export default fetch

/*
  demo

  fetch('/article/list', { method: 'delete', loading: true, data: { params: { id: 1 } } }).then(res=>console.log(res))

*/
